//
//  FGBaseTableVC.h
//  Flashfish
//
//  Created by LWF on 2017/8/15.
//  Copyright © 2017年 dong9. All rights reserved.
//

#import "FGBaseVC.h"
#import "FGBaseTableViewCell.h"
#import <MJRefresh/MJRefresh.h>

NS_ASSUME_NONNULL_BEGIN

#pragma mark - registerCells
@protocol FGBaseTableVCRegisterCells<NSObject>
@optional
/**    重写此方法注册cell, 解决某些机型 调用dequeueReusableCellWithIdentifier:(NSString *)identifier forIndexPath:(NSIndexPath *)indexPath此方法崩溃问题   */
- (void)registerCells;
/**    config unReuse cells     */
- (void)setUpScrollCells;
/**    在registerCells方法中调用     */
- (void)registerCellClass:(Class)cellClass;
/**    在registerCells方法中调用     */
- (void)registerNibCellClass:(Class)cellClass;
/**    注册每组头部、尾部 复用view     */
- (void)registerHeaderFooterViewClass:(Class)viewClass;
/**    注册每组头部、尾部 复用view     */
- (void)registerNibHeaderFooterViewClass:(Class)viewClass;

/**    表格中仅有一种cell时才用 纯代码方式(默认) nibCellClass优先级更高     */
- (Class)cellClass;
/**    表格中仅有一种cell时才用 xib方式      */
- (Class)nibCellClass;

@end

#pragma mark - tableViewRefresh
@protocol FGBaseTableVCRefresh<NSObject>
@optional
- (void)attachDropdownHeader;
/**    默认隐藏     */
- (void)attachPullUpFooter;

/**    重置数据     */
- (void)resetStatus;
- (void)loadNew;
- (void)loadMore;

/**    header、footer都会endRefresh     */
- (void)endRefresh;
- (void)endHeadRefresh;
- (void)endFootRefresh;

@end

#pragma mark - dataHandle
@protocol FGBaseTableVCDataHandle<NSObject>
@optional
/**    根据list.count有没有值来判断是否加载完毕     */
- (void)afterFetchData:(NSArray*_Nullable)list;
/**    根据total来判断是否加载完毕     */
- (void)afterFetchData:(NSArray *_Nullable)list total:(NSInteger)total;
/**    hasNext:是否有下一页     */
- (void)afterFetchData:(NSArray*_Nullable)list hasNext:(BOOL)hasNext;

/**    在屏幕之内，隐藏没有更多数据footer      */
- (void)handRefreshFooter;
/**    空白页面处理     */
- (void)handleDataListWithCount:(NSInteger)count;

@end


#pragma mark - FGBaseTableVC
@interface FGBaseTableVC : FGBaseVC<UITableViewDelegate,UITableViewDataSource,UITableViewCellBaseDelegate,FGBaseTableVCRegisterCells,FGBaseTableVCRefresh,FGBaseTableVCDataHandle>

@property(strong, nonatomic) NSMutableArray * _Nullable dataList;
@property(strong, nonatomic) UITableView *tableView;
@property(assign, nonatomic) NSInteger pageIndex;
/**    save unReuse cells     */
@property (nonatomic, strong) NSMutableArray<__kindof UITableViewCell *> * _Nullable scrollCells;



/**    自定义 tableViewStyle     */
- (UITableViewStyle)tableViewStyle;

- (__kindof UITableViewCell *)loadNibCell:(Class)cellClass;
- (__kindof UITableViewCell *)loadCell:(Class)cellClass reuseIdentifier:(nullable NSString *)reuseIdentifier;

- (__kindof UITableViewCell *)addScrollCell:(Class)cellClass;
- (__kindof UITableViewCell *)addNibScrollCell:(Class)cellClass;


#pragma mark - 空白页面 相关配置（可选）
/**    用于强制空白页面，判断是否空白页面的优先级高于dataList.count 默认值为非0 dataListCount=0时为空白页面      */
@property (nonatomic, assign) NSInteger dataListCount;
/**    自定义: 空白页面 缺省图片 不设置使用默认的     */
@property (nonatomic, copy) NSString *remindsIcon;
/**    自定义: 空白页面 缺省文字 不设置使用默认的    */
@property (nonatomic, copy) NSString *remindsMsg;


@end

NS_ASSUME_NONNULL_END
